package com.sikaryofficial.backend.controller;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.sikaryofficial.backend.annotation.TenantFilter;
import com.sikaryofficial.backend.domain.dto.req.content.ContentDeleteReq;
import com.sikaryofficial.backend.domain.dto.req.content.ContentEvaluatePageReq;
import com.sikaryofficial.backend.domain.dto.req.content.ContentPageReq;
import com.sikaryofficial.backend.domain.dto.req.content.ContentProductPageReq;
import com.sikaryofficial.backend.domain.dto.req.content.ContentStorePageReq;
import com.sikaryofficial.backend.domain.dto.resp.BrandTasteEvaluateDTO;
import com.sikaryofficial.backend.domain.dto.resp.EvaluateReplyDTO;
import com.sikaryofficial.backend.domain.dto.resp.StoreListDTO;
import com.sikaryofficial.backend.domain.vo.export.BrandTasteEvaluateExportVO;
import com.sikaryofficial.backend.manager.BackendContentManager;
import com.sikaryofficial.backend.manager.DataRemoveManager;
import com.sikaryofficial.common.core.exception.ServiceException;
import com.sikaryofficial.common.core.utils.HiResultUtil;
import com.sikaryofficial.common.core.utils.PageUtil;
import com.sikaryofficial.common.core.web.controller.BaseController;
import com.sikaryofficial.common.core.web.domain.HiResult;
import com.sikaryofficial.common.core.web.domain.PageResult;
import com.sikaryofficial.system.api.model.product.BrandTasteDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.util.Date;

/**
 * 后台-内容管理
 *
 * @author qinjinyuan
 * @date 2023-10-27
 */
@RestController
@RequestMapping("/content")
@Api(tags = "后台-内容管理")
@Slf4j
public class BackendContentController extends BaseController {
    @Autowired
    private BackendContentManager contentManager;

    @Autowired
    private DataRemoveManager dataRemoveManager;

    /**
     * 删除(评价、发布的店铺、回复)
     */
    @PostMapping("/deleteByObjId")
    @ApiOperation("删除(评价、发布的店铺、回复)")
    @TenantFilter
    public HiResult<Boolean> deleteByObjId(@Validated @RequestBody ContentDeleteReq req) {
        return HiResultUtil.success(dataRemoveManager.deleteByObjId(req));
    }

    /**
     * 屏蔽(评价、发布的店铺、回复)
     */
    @PostMapping("/shieldByObjId")
    @ApiOperation("屏蔽(评价、发布的店铺、回复)")
    @TenantFilter
    public HiResult<Boolean> shieldByObjId(@Validated @RequestBody ContentDeleteReq req) {
        return HiResultUtil.success(contentManager.shieldByObjId(req));
    }

    @PostMapping("/productPage")
    @ApiOperation("内容-发布的产品")
    @TenantFilter
    public PageResult<BrandTasteDTO> productPage(@Validated @RequestBody ContentProductPageReq req) {
        IPage<BrandTasteDTO> page = contentManager.productPage(req);
        return PageUtil.success(page.getRecords(), page.getTotal());
    }

    /**
     * 1、 评价内容列表 （条件：品牌，评价人，开始时间，结束时间）
     * 2、 评价内容列表 字段：序号，评价ID ,评价人，评价时间，评价内容，评价星级，评价产品名称，状态，回复数，点赞数
     * 3、 评价内容列表 操作：删除，屏蔽，解除屏蔽
     * 4、 增加一个状态字段 0-正常 1-屏蔽 2-举报 --- 聚合字段
     */
    @PostMapping("/evaluatePage")
    @ApiOperation("内容-产品评价")
    @TenantFilter
    public PageResult<BrandTasteEvaluateDTO> evaluatePage(@Validated @RequestBody ContentEvaluatePageReq req) {
        IPage<BrandTasteEvaluateDTO> page = contentManager.evaluatePage(req);
        return PageUtil.success(page.getRecords(), page.getTotal());
    }

    @PostMapping("/evaluateExport")
    @ApiOperation("内容-产品评价导出")
    @TenantFilter
    public void evaluateExport(HttpServletResponse response, @Validated @RequestBody ContentEvaluatePageReq req) {
        try {
            response.setContentType("application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");
            // 生成日期和时间戳
            String timestamp = DateUtil.format(new Date(), DatePattern.PURE_DATETIME_MS_PATTERN);
            String fileName = URLEncoder.encode("评价内容导出_" + timestamp, "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            EasyExcelFactory.write(response.getOutputStream(), BrandTasteEvaluateExportVO.class).sheet("evaluateContent").doWrite(contentManager.evaluateExport(req));
        } catch (Exception e) {
            log.error("productExport:{}", e);
            throw new ServiceException("product export error.");
        }
    }

    /**
     * 1、 发布的店铺列表 （条件：店铺名称，店铺地址，店铺状态）
     * 2、 发布的店铺列表 字段：序号，店铺ID，店铺名称，店铺地址，店铺状态，店铺描述，店铺图片，店铺评分，店铺评价人数，店铺评价数，店铺点赞数
     *
     * @param req
     * @return
     */
    @PostMapping("/storePage")
    @ApiOperation("内容-发布的店铺")
    @TenantFilter
    public PageResult<StoreListDTO> storePage(@Validated @RequestBody ContentStorePageReq req) {
        IPage<StoreListDTO> page = contentManager.storePage(req);
        return PageUtil.success(page.getRecords(), page.getTotal());
    }

    /**
     * 1、 回复内容列表 （条件：评价ID，评价人，开始时间，结束时间）
     *
     * @param req
     * @return
     */
    @PostMapping("/replyPage")
    @ApiOperation("内容-回复内容")
    @TenantFilter
    public PageResult<EvaluateReplyDTO> replyPage(@Validated @RequestBody ContentPageReq req) {
        IPage<EvaluateReplyDTO> page = contentManager.replyPage(req);
        return PageUtil.success(page.getRecords(), page.getTotal());
    }

}
